package test;

import android.content.Context;
import android.support.annotation.Nullable;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;

/**
 * 创建时间：2017年12月26日16:22 <br>
 * 作者：fuchaoyang <br>
 * 描述：
 */

public class MyRecyclerView extends RecyclerView {

  public MyRecyclerView(Context context) {
    super(context);
    //init();
  }

  public MyRecyclerView(Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
    //init();
  }

  public MyRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    //init();
  }

  private boolean move = false;
  private int mIndex = 0;

  private void init() {
    addOnScrollListener(new OnScrollListener() {

      @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        //在这里进行第二次滚动（最后的100米！）
        if (move) {
          move = false;
          //获取要置顶的项在当前屏幕的位置，mIndex是记录的要置顶项在RecyclerView中的位置
          int n =
              mIndex - ((LinearLayoutManager) getLayoutManager()).findFirstVisibleItemPosition();
          if (0 <= n && n < getChildCount()) {
            //获取要置顶的项顶部离RecyclerView顶部的距离
            int top = getChildAt(n).getTop();
            //最后的移动
            scrollBy(0, top);
          }
        }
      }
    });
  }

  public void moveToPosition(int n,boolean isSmooth) {
    //先从RecyclerView的LayoutManager中获取第一项和最后一项的Position
    int firstItem = ((LinearLayoutManager) getLayoutManager()).findFirstVisibleItemPosition();
    int lastItem = ((LinearLayoutManager) getLayoutManager()).findLastVisibleItemPosition();
    //然后区分情况
    if (n <= firstItem) {
      //当要置顶的项在当前显示的第一个项的前面时
      scrollToPosition(n);
    } else if (n <= lastItem) {
      //当要置顶的项已经在屏幕上显示时
      int top = getChildAt(n - firstItem).getTop();
      scrollBy(0, top);
    } else {
      //当要置顶的项在当前显示的最后一项的后面时
      scrollToPosition(n);
      //这里这个变量是用在RecyclerView滚动监听里面的
      move = true;
    }
  }
}
